
import 'package:json_annotation/json_annotation.dart';

//定义生成的文件
part 'x_bean_device.g.dart';


//设备
@JsonSerializable(explicitToJson: true) //当内部存在嵌套类时使用,不存在也可以使用
class XBaseDevice {

  //设备名称
  String? deviceName;
  //昵称(自定义修改)
  String? nickName;
  String? brand;//品牌

  /*
    自定义设备类型(注意:旧项目已使用,本地有记录,不能更改名称)
    蓝牙设备,如:打印机,电子秤等,用于支持多种设备存入设备列表,使用时再分类显示/使用
    用于serverSocket/clientSocket时,移动设备如: 服务1/2/3,客户机1/2/3
     */
  String? customType;

  //蓝牙设备地址(唯一)
  String? bluetoothAddress;
  //设备唯一码(usb设备uuid/远程设备设备id(sn序号))
  String? deviceUUID;
  String? deviceKey;//设备秘钥

  //ble 指定特征值
  List<String>? characteristicIds;



  //是否服务端,是则服务端,否则为客户端
  bool isServerSocket=false;
  String? ip;
  int port=2222;
  //是否短连接(输出后自动断开), 否则长连接
  bool isSocketShortConnect=false;

  //是否自动发送自定义心跳包
  bool isAutoSendCustomHeartBeatMsg=false;
  /*
  是否自定义socket通讯
  true: 两台设备自主socket通讯,自动以XSDK_Socket_Msg_Start_开头,以\n结尾,需要服务端回调收到确认(子设备30秒收不到确认则超时认为断连)
  false: 如第三方设备通讯(网络打印机等),也可以用于自主socket通讯(适用短通讯,不会分段),自动以\n结尾, 不需要等服务端收到确认,适用同原生android通讯
   */
  bool isCustomSocketCommunication=false;

  //写入/接收文字编码
  bool isGBK=true;

  /*
  ble连接时,是否强制使用mtu最大值写入(需外围设备支持长写ble协议),解决打印大图片分包过多打印慢问题,建议最大30k左右图片
  true: mtu=512-3, false则按实际mtu值, 注意:写入时需要按mtu值分包传输
   */
  bool isMTULongWrite=false;


  //是否已连接
  bool isConnected=false;

  //是否被选中
  bool isUserSelect=false;

  //是否启用
  bool isEnable = true;

  //是否接收设备信息(读取)
  bool isReceiveDeviceMsg = true;

  /*
    设备标签(所属场景,一台设备可多个),用于业务:
    用于蓝牙打印消息支持多台设备打印,按设备种类打印,如:后厨打印,小票打印,外卖打印,标签打印
    用于serverSocket/clientSocket传输消息, 按分类传输

    注意:
    其中蓝牙打印,优先按指定蓝牙设备地址打印,如果没有指定蓝牙设备地址,则按设备场景类型打印(多个符合则全打),
    但xsdk内部蓝牙打印不处理场景内部的设备序号(第二维度)确认哪台设备打印,如业务需要用到设备序号维度,则在业务中循环判断指定对应的蓝牙设备地址即可
     */
  List<XBaseDeviceScene>? scenes;
  //所属设备序号(一台设备只有一个)
  String serialNumber='1';

  //默认属于ESC爱普生普通打印机命令,0 ESC 1 TSPL 2CPCL
  int printCommandType= 0;
  String? printTypeName;//小票,标签

  //ESC打印机支持纸张: 80mm  58mm
  String printerPagerSize='80';

  //TSPL/CPCL标签打印机
  int printerDPI=200;
  int printerLabelSizeWidth=40; //mm
  int printerLabelSizeHeight=30;

  XBaseDevice(
      {
        this.isCustomSocketCommunication=false,//是否自定义socket通讯(客户端发送需服务端回调确认发送成功), 否则第三方如socket网络打印机
        this.deviceName,
        this.nickName,
        this.brand,
        this.bluetoothAddress,
        this.characteristicIds,
        this.deviceUUID,
        this.deviceKey,
        this.ip,
        this.port=2222,
        this.isServerSocket=false,
        this.isConnected=false,
        this.isUserSelect=false,
        this.isEnable=true,
        this.serialNumber='1',
        this.customType,
        this.scenes,
        this.printCommandType=0,
        this.printTypeName,
        this.printerPagerSize='80',
        this.printerDPI=200,
        this.printerLabelSizeWidth=40,
        this.printerLabelSizeHeight=30,
        this.isGBK=true,
        this.isReceiveDeviceMsg=true,
        this.isSocketShortConnect=false,
        this.isAutoSendCustomHeartBeatMsg=false,
        this.isMTULongWrite=false,
      }
      );


  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is XBaseDevice &&
          runtimeType == other.runtimeType &&
          bluetoothAddress == other.bluetoothAddress &&
          deviceUUID == other.deviceUUID &&
          isServerSocket == other.isServerSocket &&
          ip == other.ip &&
          port == other.port;

  @override
  int get hashCode =>
      bluetoothAddress.hashCode ^
      deviceUUID.hashCode ^
      isServerSocket.hashCode ^
      ip.hashCode ^
      port.hashCode;


  //添加固定格式: _$自定义的类名FromJson  _$自定义的类名ToJson
  factory XBaseDevice.fromJson(Map<String, dynamic> json) => _$XBaseDeviceFromJson(json);
  Map<String, dynamic> toJson() => _$XBaseDeviceToJson(this);

}

//设备使用场景
@JsonSerializable(explicitToJson: true) //当内部存在嵌套类时使用,不存在也可以使用
class XBaseDeviceScene {

  String id;
  String? name;
  bool isUserSelect=false;

  // //序号(用于消息的第二维判断处理)
  // List<String>? serialNumbers;

  XBaseDeviceScene({
    required this.id,
    this.name,
    this.isUserSelect=false,
    // this.serialNumbers,
  });

  //添加固定格式: _$自定义的类名FromJson  _$自定义的类名ToJson
  factory XBaseDeviceScene.fromJson(Map<String, dynamic> json) => _$XBaseDeviceSceneFromJson(json);
  Map<String, dynamic> toJson() => _$XBaseDeviceSceneToJson(this);

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is XBaseDeviceScene &&
          runtimeType == other.runtimeType &&
          id == other.id;

  @override
  int get hashCode => id.hashCode;
}




